home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / LK_V1.06.LHA / LK V1.06 / SOURCES / autorun.s next >
Encoding:
Text File  |  1994-11-01  |  8.6 KB  |  459 lines

  1. ;    OPT    O+,OW-,L+,P=68030
  2. ;--------------------------------------------------
  3. ;    lk V1.01 AutoRun code.
  4. ;    $VER: autorun.s 1.00 (10.07.94)
  5. ;    Written by Alexis WILKE (c) 1994.
  6. ;
  7. ;    This code will create a new process and
  8. ;    then quit. Making the new process be a
  9. ;    background task.
  10. ;--------------------------------------------------
  11.  
  12.     incdir    'include:'
  13.     incdir    'include:include.strip/'
  14.     include    'exec/nodes.i'
  15.     include    'dos/dosextens.i'
  16.     include    'sw.i'
  17.  
  18. ;    IFD    BARFLY
  19. ;    MC68030
  20. ;    ENDC
  21.  
  22. YES    =    0
  23. NO    =    1
  24. USE20    =    NO        ;Use a 68020?
  25.  
  26. ;    IFND    SYS                ;Copy of my SYS
  27. ;SYS    MACRO
  28. ;    IFNC    '\2',''
  29. ;    MoveA.L    \2,A6
  30. ;    ENDC
  31. ;    Jsr    _\1(A6)
  32. ;    ENDM
  33. ;    ENDC
  34.  
  35.  STRUCTURE MCommandLineInterface,0
  36.     LONG    mcli_Result2        ;Value of IoErr from last command
  37.     BSTR    mcli_SetName        ;Name of current directory
  38.     BPTR    mcli_CommandDir        ;Head of the path locklist
  39.     LONG    mcli_ReturnCode        ;Return code from last command
  40.     BSTR    mcli_CommandName    ;Name of current command
  41.     LONG    mcli_FailLevel        ;Fail level (set by FAILAT)
  42.     BSTR    mcli_Prompt        ;Current prompt (set by PROMPT)
  43.     BPTR    mcli_StandardInput    ;Default (terminal) CLI input
  44.     BPTR    mcli_CurrentInput    ;Current CLI input
  45.     BSTR    mcli_CommandFile    ;Name of EXECUTE command file
  46.     LONG    mcli_Interactive    ;Boolean True if prompts required
  47.     LONG    mcli_Background        ;Boolean True if CLI created by RUN
  48.     BPTR    mcli_CurrentOutput    ;Current CLI output
  49.     LONG    mcli_DefaultStack    ;Stack size to be obtained in long words
  50.     BPTR    mcli_StandardOutput    ;Default (terminal) CLI output
  51.     BPTR    mcli_Module        ;SegList of currently loaded command
  52.     LABEL    mcli_SIZEOF        ;CommandLineInterface
  53.  
  54.  
  55. CPYNM    MACRO
  56.     Move.L    \1(A4),D1
  57.     Beq.B    .\@exit
  58.     Pea    $108(A0)
  59.     Move.L    #$108,(A0)+            ;Put this buffer size
  60.     IFEQ    USE20
  61.     Lea    (D1.L*4),A1
  62.     ELSEIF
  63.     Lsl.L    #$02,D1
  64.     MoveA.L    D1,A1
  65.     ENDC
  66.     Move.L    A0,D1
  67.     MoveQ    #$00,D0
  68.     Move.B    (A1),D0
  69. .\@cpy
  70.     Move.B    (A1)+,(A0)+            ;Copy string
  71.     Dbf    D0,.\@cpy
  72.     Clr.B    (A0)
  73.     MoveA.L    (A7)+,A0
  74.     IFC    '\2','SAVE'
  75.     Lsr.L    #$02,D1
  76.     ENDC
  77. .\@exit
  78.     IFC    '\2','SAVE'
  79.     Move.L    D1,\1(A6)
  80.     ENDC
  81.     ENDM
  82.  
  83. DUPLOCK    MACRO
  84.     Move.L    \1(A4),D0
  85.     Beq.B    .\@nolock
  86.     Move.L    D0,D1
  87.     Pea    (A6)
  88.     SYS    DupLock,A5
  89.     MoveA.L    (A7)+,A6
  90. .\@nolock
  91.     Move.L    D0,\1(A6)
  92.     ENDM
  93.  
  94.  
  95.     XDEF    start
  96.  
  97.     SECTION    NOMERGE,CODE
  98. start:
  99.     Pea    (A2)
  100.     Lea    start(PC),A2            ;Save registers from startup
  101.     MoveM.L    D0-D7/A0-A1,registers-start(A2)
  102.     Move.L    (A7)+,D0
  103.     MoveM.L    D0/A3-A6,registers+(8+2)*4-start(A2)
  104.     SubA.L    A1,A1
  105.     SYS    FindTask,4.W
  106.     MoveA.L    D0,A3
  107.     CmpI.B    #NT_PROCESS,LN_TYPE(A3)        ;This should always be a process!
  108.     Bne.B    workbench
  109.     Move.L    pr_CLI(A3),D0            ;CLI or Workbench process?
  110.     Bne.B    cli
  111.  
  112. workbench:
  113.     MoveA.L    start-4,A0
  114.     IFEQ    USE20
  115.     Pea    (4.W,A0.L*4)
  116.     ELSEIF
  117.     AddA.L    A0,A0
  118.     AddA.L    A0,A0
  119.     Pea    4(A0)
  120.     ENDC
  121.     MoveM.L    registers(PC),D0-D7/A0-A6    ;Restore correct registers.
  122.     Rts
  123.  
  124.  
  125. cli:
  126.     MoveQ    #$00,D7
  127.     IFEQ    USE20
  128.     Lea    (D0.L*4),A4
  129.     ELSEIF
  130.     Lsl.L    #$02,D0
  131.     MoveA.L    D0,A4
  132.     ENDC
  133.     Lea    dosname-start(A2),A1
  134.     SYS    OldOpenLibrary            ;Get dos library pointer
  135.     Tst.L    D0
  136.     Beq    .error
  137.     Move.L    D0,dosbase-start(A2)        ;Save DOSBase for later
  138.     MoveA.L    D0,A5
  139.     Move.L    #$108*5+8+endcopy-startup+mcli_SIZEOF,D0
  140.                         ;+8 for segment list link
  141.                         ;+108 for name +108 for command
  142.     Move.L    mcli_CommandDir(A4),D1        ;Some PATH lock?
  143.     Beq    .nocmddir
  144. .sizecmddir
  145.     AddQ.L    #$08,D0                ;Linked list of 8 bytes
  146.     IFEQ    USE20
  147.     Move.L    (D1.L*4),D1
  148.     ELSEIF
  149.     Lsl.L    #$02,D1
  150.     MoveA.L    D1,A0
  151.     Move.L    (A0),D1
  152.     ENDC
  153.     Bne.B    .sizecmddir
  154. .nocmddir
  155.  
  156.  
  157.  
  158. .usenewproc
  159.     Move.L    D0,D4                ;Keep segment size
  160.     MoveQ    #$00,D1                ;No flag requirement
  161.     SYS    AllocMem,4.W            ;Allocates the fake segment
  162.     Move.L    D0,D5                ;Not Enough memory?
  163.     Beq    .exit
  164.     MoveA.L    D5,A0                ;fake segment is in D4 and A0 now
  165.     Move.L    D4,(A0)+            ;Save segment size
  166.     Move.L    A0,D3
  167.  
  168.  
  169.     MoveA.L    A5,A6
  170.     Move.L    pr_CurrentDir(A3),D1
  171.     Beq.B    .nocurdir
  172.     SYS    DupLock
  173.     Move.L    D0,curdir-start(A2)
  174. .nocurdir
  175.     Lea    window-start(A2),A0
  176.     Move.L    A0,D1
  177.     Move.L    #MODE_OLDFILE,D2
  178.     SYS    Open
  179.     Move.L    D0,input-start(A2)
  180.  
  181.     Lea    window-start(A2),A0
  182.     Move.L    A0,D1
  183.     Move.L    #MODE_NEWFILE,D2
  184.     SYS    Open
  185.     Move.L    D0,output-start(A2)
  186.  
  187.     CmpI.W    #36,LIB_VERSION(A6)
  188.     Bcs.B    .noextra
  189.     Move.L    pr_HomeDir(A3),D1
  190.     Beq.B    .nohomedir
  191.     SYS    DupLock
  192.     Move.L    D0,homedir-start(A2)
  193. .nohomedir
  194.  
  195.  
  196. .noextra
  197.  
  198.     MoveA.L    D3,A0
  199.     Lsr.L    #$02,D3                ;We have the segment list in D3!
  200.     Move.L    -4(A2),(A0)+            ;Link with next segment
  201.     Lea    startup-start(A2),A1        ;Copy startup program
  202.     Move.W    #(endcopy-startup)>>1-1,D0
  203. .copystartup
  204.     Move.W    (A1)+,(A0)+
  205.     Dbf    D0,.copystartup
  206.  
  207.  
  208.     MoveA.L    A0,A6
  209.     Move.L    #mcli_SIZEOF,D4            ;Next pointer
  210.     Add.L    A6,D4
  211.                         ;Clear some variables
  212.     Clr.L    mcli_Result2(A6)
  213.     Clr.L    mcli_ReturnCode(A6)
  214.     Clr.L    mcli_StandardInput(A6)
  215.     Clr.L    mcli_CurrentInput(A6)
  216.     Clr.L    mcli_CurrentOutput(A6)
  217.     Clr.L    mcli_StandardOutput(A6)
  218.     Clr.L    mcli_CommandDir(A6)            ;Defaulted to none
  219.                         ;Copy some variables
  220.     Move.L    mcli_FailLevel(A4),mcli_FailLevel(A6)
  221.     Move.L    mcli_Interactive(A4),mcli_Interactive(A6)
  222.     Move.L    mcli_Background(A4),mcli_Background(A6)
  223.     Move.L    mcli_DefaultStack(A4),mcli_DefaultStack(A6)
  224.  
  225.     Move.L    D3,mcli_Module(A6)
  226.  
  227.  
  228.     Move.L    mcli_CommandDir(A4),D2
  229.     Beq.B    .reallynocmddir
  230.     Pea    (A6)
  231.     Lsr.L    #$02,D4
  232.     Move.L    D4,D7
  233.     Move.L    D4,mcli_CommandDir(A6)
  234.     IFNE    USE20
  235.     Lsl.L    #$02,D4
  236.     ENDC
  237.     MoveA.L    A5,A6
  238. .morecmddir
  239.     IFEQ    USE20
  240.     Move.L    (4.W,D2.L*4),D1
  241.     ELSEIF
  242.     Lsl.L    #$02,D2
  243.     MoveA.L    D2,A0
  244.     Move.L    4(A0),D1
  245.     ENDC
  246.     SYS    DupLock
  247.     IFEQ    USE20
  248.     AddQ.L    #$08>>2,D4
  249.     Move.L    D0,((4-8).W,D4.L*4)
  250.     Bne.B    .cmddirok
  251.     Clr.L    ((0-8).W,D4.L*4)        ;No next...
  252.     AddQ.L    #$04,A7
  253.     Bra    .free
  254. .cmddirok
  255.     Move.L    D4,((0-8).W,D4.L*4)
  256.     Move.L    (D2.L*4),D2
  257.     ELSEIF
  258.     MoveA.L    D4,A0
  259.     AddQ.L    #$08,D4
  260.     Move.L    D4,D1
  261.     Lsr.L    #$02,D1
  262.     Move.L    D1,(A0)+
  263.     Move.L    D0,(A0)+
  264.     Bne.B    .cmddirok
  265.     Clr.L    -8(A0)            ;No next...
  266.     AddQ.L    #$04,A7
  267.     Bra    .free
  268. .cmddirok
  269.     MoveA.L    D2,A0
  270.     Move.L    (A0),D2
  271.     ENDC
  272.     Bne.B    .morecmddir
  273.     MoveA.L    (A7)+,A6
  274.     IFEQ    USE20
  275.     Lsl.L    #$02,D4
  276.     Clr.L    (-8.W,D4.L)
  277.     ELSEIF
  278.     MoveA.L    D4,A0
  279.     Clr.L    -8(A0)
  280.     ENDC
  281. .reallynocmddir
  282.  
  283.     MoveA.L    D4,A0                ;Reach next data...
  284.     CPYNM    mcli_SetName,SAVE
  285.     CPYNM    mcli_Prompt,SAVE
  286.     CPYNM    mcli_CommandFile,SAVE
  287.     CPYNM    mcli_CommandName,SAVE
  288.     Lsl.L    #$02,D1
  289.     AddQ.L    #$01,D1
  290.     Move.L    #$108,(A0)+
  291.     Move.L    registers-start(A2),D0
  292.     Move.B    D0,(A0)+
  293.     MoveA.L    registers+4*8-start(A2),A1
  294.     Move.L    A0,registers+4*8-start(A2)
  295.     Tst.L    D0
  296.     Beq.B    .nocmd
  297.     SubQ.W    #$01,D0
  298. .copycommandline
  299.     Move.B    (A1)+,(A0)+            ;Copy command line
  300.     Dbf    D0,.copycommandline
  301. .nocmd
  302.     Clr.B    (A0)+
  303.  
  304.     MoveQ    #$00,D2
  305.     Move.B    LN_PRI(A3),D2
  306.     Move.L    pr_StackSize(A3),D4
  307.     SYS    CreateProc,A5
  308.     Tst.L    D0
  309.     Bne.B    .done
  310. .free
  311.     Tst.L    D7                ;It didn't work...
  312.     Beq.B    .nodup
  313.     MoveA.L    A5,A6
  314. .freedup
  315.     IFEQ    USE20
  316.     Move.L    (4.W,D7.L*4),D1
  317.     ELSEIF
  318.     Lsl.L    #$02,D7
  319.     MoveA.L    D7,A0
  320.     Move.L    4(A0),D1
  321.     ENDC
  322.     Beq.B    .nodup                ;<- branch on the one which made
  323.     SYS    UnLock                ;   the error...
  324.     IFEQ    USE20
  325.     Move.L    (D7.L*4),D7
  326.     ELSEIF
  327.     MoveA.L    D7,A0
  328.     Move.L    (A0),D7
  329.     ENDC
  330.     Bne.B    .freedup
  331. .nodup
  332.     MoveA.L    D5,A1
  333.     Move.L    (A1),D0
  334.     SYS    FreeMem,(4).W            ;Free the fake segment
  335. .exit
  336.     MoveA.L    A5,A1
  337.     SYS    CloseLibrary,(4).W        ;Close dos.library
  338.     Bra.B    .error
  339. .done
  340.     Clr.L    -4(A2)                ;Unlink following segments
  341. .error
  342.     MoveQ    #$00,D0
  343.     Rts
  344.  
  345.  
  346.  
  347. dosname        Dc.B    "dos.library",0
  348. window        Dc.B    "*",0
  349.     EVEN
  350.  
  351.  
  352.  
  353. ;--------------------------------------------------    STARTUP FOR TRANSPARENCY
  354. startup:
  355.     SubA.L    A1,A1
  356.     SYS    FindTask,4.W
  357.     MoveA.L    D0,A3
  358.     Lea    startup-4(PC),A2
  359.     Move.L    (A7),returncode-(startup-4)(A2)
  360.     Lea    quit-(startup-4)(A2),A0        ;Ask for a quit before to leave
  361.     Move.L    A0,(A7)
  362.     Lea    clistc-(startup-4)(A2),A0
  363.     Move.L    A0,pr_CLI(A3)            ;The CLI is here!
  364.  
  365.     Tst.L    pr_CurrentDir(A3)
  366.     Bne.B    .inputexist
  367.     Move.L    curdir(PC),pr_CurrentDir(A3)
  368. .curdirexist
  369.     Tst.L    pr_CIS(A3)
  370.     Bne.B    .inputexist
  371.     Move.L    input(PC),pr_CIS(A3)
  372. .inputexist
  373.     Tst.L    pr_COS(A3)
  374.     Bne.B    .outputexist
  375.     Move.L    output(PC),pr_COS(A3)
  376. .outputexist
  377.     MoveA.L    dosbase-(startup-4)(A2),A0
  378.     CmpI.W    #36,LIB_VERSION(A0)
  379.     Bcs.B    .lowversion
  380.     Tst.L    pr_HomeDir(A3)
  381.     Bne.B    .homeexist
  382.     Move.L    homedir(PC),pr_HomeDir(A3)
  383. .homeexist
  384.     Tst.L    pr_CES(A3)
  385.     Bne.B    .errexist
  386.     Move.L    output(PC),pr_CES(A3)
  387. .errexist
  388. .lowversion
  389.     MoveA.L    (A2),A2
  390.     IFEQ    USE20
  391.     Pea    (4.W,A2.L*4)
  392.     ELSEIF
  393.     AddA.L    A2,A2
  394.     AddA.L    A2,A2
  395.     Pea    4(A2)
  396.     ENDC
  397.  
  398.     MoveM.L    registers(PC),D0-D7/A0-A6
  399.     Rts
  400. quit:
  401.     Move.L    returncode(PC),-(A7)        ;Save return pointer
  402.     MoveM.L    D0-D7/A0-A6,-(A7)
  403.     MoveA.L    dosbase(PC),A6
  404.  
  405.     Move.L    curdir(PC),D1
  406.     Beq.B    .nocurdir
  407.     SYS    UnLock
  408. .nocurdir
  409.     Move.L    input(PC),D1
  410.     Beq.B    .noinput
  411.     SYS    Close
  412. .noinput
  413.     Move.L    output(PC),D1
  414.     Beq.B    .nooutput
  415.     SYS    Close
  416. .nooutput
  417.     Move.L    homedir(PC),D1
  418.     Beq.B    .nohome
  419.     SYS    UnLock
  420. .nohome
  421.  
  422.     Move.L    clistc+cli_CommandDir(PC),D2
  423.     Beq.B    .nodir
  424. .freedir
  425.     IFEQ    USE20
  426.     Move.L    (4.W,D2.L*4),D1
  427.     ELSEIF
  428.     Lsl.L    #$02,D2
  429.     MoveA.L    D2,A2
  430.     Move.L    4(A2),D1
  431.     ENDC
  432.     SYS    UnLock
  433.     IFEQ    USE20
  434.     Move.L    (D2.L*4),D2
  435.     ELSEIF
  436.     Move.L    (A2),D2
  437.     ENDC
  438.     Bne.B    .freedir
  439. .nodir
  440.     Lea    startup-4(PC),A0
  441.     Move.L    A0,D1
  442.     Lsr.L    #$02,D1
  443.     SYS    UnLoadSeg
  444.     MoveA.L    A6,A1
  445.     SYS    CloseLibrary,(4).W
  446.     MoveM.L    (A7)+,D0-D7/A0-A6
  447.     Rts
  448. registers    Ds.L    8+7
  449. returncode    Ds.L    1
  450. dosbase        Ds.L    1
  451. curdir        Ds.L    1
  452. input        Ds.L    1
  453. output        Ds.L    1
  454. homedir        Ds.L    1
  455.     Ds.L    0            ;.align
  456. endcopy:
  457. clistc
  458.  
  459.